package android.test;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Security;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * Created by dinhthao on 6/25/13.
 */
public class GmailSender extends  Authenticator{
    private String mailhost = "smtp.gmail.com";
    private String user;
    private String password;
    private Session session;
    static {
        Security.addProvider(new JSSEProvider());
    }

    public GmailSender(String _user, String _pass){
        this.user = _user;
        this.password = _pass;
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.host", mailhost);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.quitwait", "false");

        session = Session.getDefaultInstance(props, this);

    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password);
    }

    public synchronized  void sendMail(String subject, String body, String sender, String recipient) throws Exception{
        try{
            MimeMessage mimeMessage = new MimeMessage(session);
            DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
            mimeMessage.setSender(new InternetAddress(sender));
            mimeMessage.setSubject(subject);
            mimeMessage.setDataHandler(handler);
            if(recipient.indexOf(',') > 0){
                mimeMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));
            }else {
                mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
            }
            Transport.send(mimeMessage);

        }catch (Exception e){

        }
    }

    public class ByteArrayDataSource implements DataSource{

        private byte[] data;
        private String type;

        public ByteArrayDataSource(byte[] data, String type){
            super();
            this.data = data;
            this.type = type;
        }
        public ByteArrayDataSource(byte[] data){
            super();
            this.data = data;
        }

        public void setType(String type){
             this.type = type;
        }




        @Override
        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(data);
        }

        @Override
        public OutputStream getOutputStream() throws IOException {
            throw  new IOException("Not supported!");
        }

        @Override
        public String getContentType() {
            if(type == null){
                return "application/octet-stream";
            }
            else {
                return type;
            }
        }

        @Override
        public String getName() {
            return null;
        }
    }


}
